package org.example.day05;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO+
 * 现有N个任务需要处理，同一时间只能处理一个任务，处理每个任务所需要的时间固定为1。<br> 每个任务都有最晚处理时间限制和积分值，在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。<br> 可用于处理任务的时间有限，请问在有限的时间内，可获得的最多积分。<br>
 *
 * 现有N个任务需要处理，同一时间只能处理一个任务，处理每个任务所需要的时间固定为1。
 * 每个任务都有最晚处理时间限制和积分值，在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。
 * 可用于处理任务的时间有限，请问在有限的时间内，可获得的最多积分。
 * @date 2024/3/11 15:22
 */
// 任务类


// 定义任务类
class Task {
    int SLA; // 最晚处理时间
    int V;   // 积分

    public Task(int SLA, int V) {
        this.SLA = SLA;
        this.V = V;
    }
}

public class test093 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取任务数量和可用处理时间
        int N = scanner.nextInt();
        int T = scanner.nextInt();

        // 创建任务数组
        Task[] tasks = new Task[N];

        // 读取任务信息
        for (int i = 0; i < N; i++) {
            int sla = scanner.nextInt();
            int v = scanner.nextInt();
            tasks[i] = new Task(sla, v);
        }

        // 根据最晚处理时间对任务进行排序
        Arrays.sort(tasks, new Comparator<Task>() {
            public int compare(Task taskA, Task taskB) {
                return taskA.SLA - taskB.SLA;
            }
        });

        // 初始化积分
        int totalScore = 0;

        // 初始化一个用于记录任务是否已经处理的数组
        boolean[] processed = new boolean[N]; // 默认初始化为false

        // 对于每个可用的时间单位，从后往前查找最优的任务处理
        for (int time = T; time > 0; time--) {
            // 初始化用于选择当前时间点的任务的变量
            int idx = -1;
            int maxScore = 0;
            for (int i = 0; i < N; i++) {
                // 如果当前任务可以在当前时间处理，并且积分高于已记录的最高积分，且未被处理
                if (tasks[i].SLA >= time && tasks[i].V > maxScore && !processed[i]) {
                    idx = i;
                    maxScore = tasks[i].V;
                }
            }
            // 如果找到了合适的任务，处理它
            if (idx != -1) {
                processed[idx] = true;  // 标记为已处理
                totalScore += maxScore;  // 增加积分
            }
        }

        // 输出最多可获得的积分
        System.out.println(totalScore);

        scanner.close();
    }
}

